const fs = require('fs')
const path = require('path')

// 下面写箭头函数是为了回调函数中能访问到上一级域中的callback
const moveFile = async function (newPath, oldPath, callback) {
    // 首先判断要移动文件的上一级目录是否存在，如果不存在就创建一个，存在的话直接移动文件就好了
    const parentDir = path.resolve(newPath,'../')

    // 这里需要注意的是当报错时说明上一级目录不存在，需要创建上一级目录，思维相反
    fs.access( parentDir, err => {
        if (err){
            fs.mkdir(parentDir, { recursive: true }, err2 => {
                if (err2) return callback({
                    err: err2,
                    isSuccess: false
                });
                renameFile(oldPath, newPath, callback)
            })
        }else {
            renameFile(oldPath, newPath, callback)
        }
    })
}

const renameFile = function (oldPath, newPath, callback) {
    return new Promise((resolve,reject)=>{
        // 因为移动文件之前所有文件都在tmp文件夹内，所以不大可能在这里移动文件时候出现文件重名问题，所以不用考虑文件重名问题
        fs.rename(oldPath, newPath, err => {
            const status = {
                err: err,
                isSuccess: false
            }

            const is =  callback && (typeof(callback) == 'function')

            /* 当callback没有传递或者传递的不是一个函数，那返回一个promise
            * 当callback传递了并且是一个函数就调用该函数
            * */
            if(!err) status.isSuccess = true;
            if (is) return callback(status);
            resolve(status)
        })
    })

}

module.exports = moveFile
